#include "common_inc.h"
#include "tim.h"
#include "usart.h"
#include "oled_u8g2.h"
#include "oled_test.h"
#include "RGB.h"
#include "retarget.h"
#include "Spectrum.h"
#include "timer_tick.h"
#include "adc.h"
#include "audio_sample.h"

u8g2_t u8g2;
uint8_t uartBuffer[1];
uint8_t recvBuff[BUFFER_SIZE];  //接收数据缓存数组
volatile uint8_t recvLength = 0;  //接收一帧数据的长度
volatile uint8_t recvDndFlag = 0; //一帧数据接收完成标志
// ADC转换值
__IO uint16_t ADC_ConvertedValue;
// 旋转编码器计数
int8_t Encoder_count = 0;

void Main()
{
    /** ---------------------------------------- 定时器中断开启 -------------------------------------------------------- */
    HAL_TIM_Base_Start_IT(&htim3);
    HAL_TIM_Base_Start_IT(&htim4);
    /** ------------------------------------------------------------------------------------------------------------- */

    /** ---------------------------------------- 串口接收中断开启 ------------------------------------------------------ */
    // 添加接收中断开启函数，这样在第一次接收到数据的时候才会触发中断
    // HAL_UART_Receive_IT(&huart1, (uint8_t *)uartBuffer, 1);
    /** ------------------------------------------------------------------------------------------------------------- */

    /** --------------------------------- 串口IDLE空闲中断+DMA数据接收 ------------------------------------------------- */
    /**
     * 可以实现任意字符串接收并输出
     * 在串口无数据接收的情况下，不会产生，当清除IDLE标志位后，必须有接收到第一个数据后，才开始触发，一但接收的数据断流，没有接收到数据，即产生IDLE中断
     */
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);    //使能IDLE中断
    HAL_UART_Receive_DMA(&huart1, recvBuff, BUFFER_SIZE);
    /** ------------------------------------------------------------------------------------------------------------- */

    /** ----------------------------------------------- ADC --------------------------------------------------------- */
    // ADC校准
    while(HAL_ADCEx_Calibration_Start(&hadc1)!=HAL_OK);
    // 开启ADC中断转换
    //  HAL_ADC_Start_IT(&hadc1);
    /** ------------------------------------------------------------------------------------------------------------- */

    /** ----------------------------------------------- PWM开启 --------------------------------------------------- -- */
    // HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
    // /* 修改定时器的比较寄存器值 */
    // __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 10);
    /** ------------------------------------------------------------------------------------------------------------- */

    // 串口printf初始化
    RetargetInit(&huart1);

    // RGB初始化
    RGBInit();

    // OLED初始化
    // u8g2Init(&u8g2);
    // OLED显示字体测试
    // testShowFont(&u8g2);

    // 频谱分析初始化
    spectrum_init();

    while (true)
    {
        // RGB灯效
//        breatheEffect(RAINBOW_Color[YELLOW]);
//        rhythmEffect();

        // 用于保存转换计算后的电压值，范围0~3.3
//        float ADC_Vol =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的AD值
//        printf("The current AD value:%04d\r\n", ADC_ConvertedValue);
//        printf("The current VOL value:%f\r\n",ADC_Vol); //实际电压值
    }
}

/* Event Callbacks -----------------------------------------------------------*/
extern "C"
void OnTimer3Callback()
{
//    rhythmEffect();
    systick_increase(1);
}
extern "C"
void OnTimer4Callback()
{
    spectrum_process();
}

extern "C"
void OnDMA1_CH1Callback()
{
    audio_sample_stop();
}

extern "C"
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef* hspi)
{
    setIsRgbTxBusy(false);
}

// 串口接收中断
extern "C"
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
//        HAL_UART_Receive_IT(&huart1, (uint8_t *)uartBuffer, 1);
//        HAL_UART_Transmit(&huart1, (uint8_t *)uartBuffer, 1, 0xffff);
//        HAL_UART_Receive_DMA(&huart1, recvBuff, 1);
//        HAL_UART_Transmit_DMA(&huart1, recvBuff, 1);
    }
}

// ADC中断
extern "C"
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    ADC_ConvertedValue = HAL_ADC_GetValue(hadc);
}

// 外部中断
extern "C"
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin==GPIO_PIN_0)
    {
        if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)
        {
            Encoder_count--;
        }
    }
    else if (GPIO_Pin == GPIO_PIN_1)
    {
        if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET)
        {
            Encoder_count++;
        }
    }
}
